package javaer.starter.core.generator;

import freemarker.template.TemplateException;
import javaer.starter.constant.SymbolEnum;
import javaer.starter.core.BuildContext;
import javaer.starter.core.handler.ModuleContext;
import javaer.starter.core.metadata.PomXml;
import javaer.starter.util.HumpUtil;

import java.io.IOException;
import java.nio.file.Paths;

/**
 * 资源生成器
 *
 * @author yangzhen
 */
public interface IGenerator {

    void generate(BuildContext buildContext) throws TemplateException, IOException;

    default ModuleContext initModuleContext(BuildContext buildContext, PomXml pomXml) {
        ModuleContext moduleContext = new ModuleContext();
        moduleContext.setParent(pomXml.getParent());
        moduleContext.setImRootPom(pomXml.getImRootPom());
        moduleContext.setImStarterPom(pomXml.getImStarterPom());
        moduleContext.setTypeId(buildContext.getTypeId());
        moduleContext.setTypeName(buildContext.getTypeName());
        moduleContext.setModuleId(pomXml.getModuleId());
        moduleContext.setModuleName(pomXml.getModuleId().toLowerCase());
        moduleContext.setGroupId(pomXml.getGroupId());
        moduleContext.setArtifactId(pomXml.getArtifactId());
        moduleContext.setArtifactIdHump(HumpUtil.toHump(pomXml.getArtifactId(), SymbolEnum.HORIZONTAL_LINE.getSymbol()));
        moduleContext.setVersion(pomXml.getVersion());
        moduleContext.setBasePackage(pomXml.getBasePackage());
        moduleContext.setBasePackagePath(Paths.get(pomXml.getBasePackage().replace(SymbolEnum.POINT.getSymbol(), SymbolEnum.SLASH.getSymbol())));
        moduleContext.setModuleArtifactId(pomXml.getArtifactId());
        moduleContext.setModuleArtifactIdHump(HumpUtil.toHump(pomXml.getArtifactId(), SymbolEnum.HORIZONTAL_LINE.getSymbol()));
        moduleContext.setModulePackage(pomXml.getModulePackage());
        moduleContext.setModulePackagePath(Paths.get(pomXml.getModulePackage().replace(SymbolEnum.POINT.getSymbol(), SymbolEnum.SLASH.getSymbol())));
        moduleContext.setDependencies(pomXml.getDependencies());
        moduleContext.setDependencyModules(pomXml.getDependencyModules());
        moduleContext.setDependencyIdSet(pomXml.getDependencyIdSet());
        moduleContext.setProjectPath(buildContext.getProjectPath());
        moduleContext.setDescription(pomXml.getDescription());
        moduleContext.setProperties(pomXml.getProperties());
        moduleContext.setModules(pomXml.getModules());
        moduleContext.setMainClass(pomXml.getMainClass());
        moduleContext.setDependencyManagement(pomXml.getDependencyManagement());
        moduleContext.setTemplatePath(buildContext.getTemplatePath().resolve(pomXml.getModuleId().toLowerCase()));
        return moduleContext;
    }
}
